
import java.util.concurrent.*;

/**
 * @author Hawkins
 * <p>
 * <p>
 * 在指定时间内执行某个task，超时则退出执行。
 */
public class TimedCall {
    public static void main(String[] args) throws InterruptedException,
            ExecutionException, TimeoutException {
        long timeout = 1000;// 任务必须在设定时间内完成，否则任务将被强制关闭  
        // long timeNeed = 2000;// 任务完成需要的时长。
        TimeUnit timeUnit = TimeUnit.MILLISECONDS;// 时间单位  
        ExecutorService executor = Executors.newSingleThreadExecutor();// 高级并发API  

        Runnable task = new MyThread();

        while (!timedCall(executor, task, timeout, timeUnit)) ;// 在某些场景下，需要不断尝试执行任务，直到能够在限定时间内执行完毕。

    }

    private static boolean timedCall(ExecutorService executor, Runnable c, long timeout, TimeUnit timeUnit) throws InterruptedException,
            ExecutionException {
        // FutureTask<?> task = new FutureTask<Object>(c, null);  
        // executor.execute(task);  
        //        
        // task.get(timeout, timeUnit);  
        Future<?> future = executor.submit(c);
        try {
            future.get(timeout, timeUnit);
            return true;
        } catch (TimeoutException e) {
            future.cancel(true);// 参数设为true，向执行线程发送中断通知。否则，允许已经启动的线程继续执行直到完成任务。  
            System.err.println("任务执行超时,强制退出");
            return false;
        }
    }
}  
  
